//package com.open.yujiakj.utils.pdf;
//
//import com.itextpdf.text.*;
//import com.itextpdf.text.pdf.BaseFont;
//import com.itextpdf.text.pdf.PdfPCell;
//import com.itextpdf.text.pdf.PdfPTable;
//import com.itextpdf.text.pdf.PdfWriter;
//import org.apache.commons.io.IOUtils;
//import org.apache.commons.logging.Log;
//import org.apache.commons.logging.LogFactory;
//
//import java.io.File;
//import java.io.FileNotFoundException;
//import java.io.FileOutputStream;
//import java.io.OutputStream;
//import java.util.List;
//
///**
// * pdf工具类
// *
// *
// *
// */
//public class PdfUtil {
//
//	private static Font keyfont = null;// 设置字体大小
//	private static Font textfont = null;// 设置字体大小
//	private static int maxWidth = 520;
//
//	private static final Log logger = LogFactory.getLog(PdfUtil.class);
//
//	static {
//		BaseFont bfChinese;
//		try {
//			bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
//			keyfont = new Font(bfChinese, 8, Font.BOLD);// 设置字体大小
//			textfont = new Font(bfChinese, 8, Font.NORMAL);// 设置字体大小
//		} catch (Exception e) {
//			logger.error("pdf初始化中文字体出错", e);
//		}
//	}
//
//	/**
//	 * 将内容写到pdf中
//	 *
//	 * @param file
//	 * @param content
//	 */
//	public static void writPdf(File file, String content) {
//		OutputStream out = null;
//		try {
//			out = new FileOutputStream(file);
//			writePdf(out, content);
//		} catch (Exception e) {
//			logger.error("导出pdf内容失败", e);
//		} finally {
//			IOUtils.closeQuietly(out);
//		}
//	}
//
//	/**
//	 * 将内容写到pdf中
//	 *
//	 * @param out
//	 * @param content
//	 * @throws DocumentException
//	 */
//	public static void writePdf(OutputStream out, String content) throws DocumentException {
//		Document document = new Document();// 建立一个Document对象
//		document.setPageSize(PageSize.A4);// 设置页面大小
//		PdfWriter.getInstance(document, out);
//		document.open();
//		document.add(new Paragraph(content, textfont));
//		document.close();
//	}
//
//	/**
//	 * 导出pdf的table表格
//	 *
//	 * @param file
//	 *            文件
//	 * @param table
//	 *            表格内容
//	 * @throws DocumentException
//	 * @throws FileNotFoundException
//	 */
//	public static void exportTable(File file, List<List<String>> table) throws DocumentException, FileNotFoundException {
//		OutputStream out = null;
//		try {
//			out = new FileOutputStream(file);
//			exportTable(out, table);
//		} catch (Exception e) {
//			logger.error("导出pdf表格失败", e);
//		} finally {
//			IOUtils.closeQuietly(out);
//		}
//	}
//
//	/**
//	 * 导出pdf的table表格
//	 *
//	 * @param out
//	 *            输出流
//	 * @param table
//	 *            表格内容
//	 * @throws DocumentException
//	 */
//	public static void exportTable(OutputStream out, List<List<String>> table) throws DocumentException {
//		Document document = new Document();// 建立一个Document对象
//		document.setPageSize(PageSize.A4);// 设置页面大小
//		PdfWriter.getInstance(document, out);
//		document.open();
//		int columns = table.get(0).size();
//		PdfPTable pdfTable = createTable(columns);
//		for (List<String> row : table) {
//			for (String cellContent : row) {
//				pdfTable.addCell(createCell(cellContent, keyfont, Element.ALIGN_CENTER));
//			}
//		}
//		document.add(pdfTable);
//		document.close();
//	}
//
//	public static PdfPCell createCell(String value, Font font, int align) {
//		PdfPCell cell = new PdfPCell();
//		cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
//		cell.setHorizontalAlignment(align);
//		cell.setPhrase(new Phrase(value, font));
//		return cell;
//	}
//
//	public static PdfPCell createCell(String value, Font font) {
//		PdfPCell cell = new PdfPCell();
//		cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
//		cell.setHorizontalAlignment(Element.ALIGN_CENTER);
//		cell.setPhrase(new Phrase(value, font));
//		return cell;
//	}
//
//	public static PdfPCell createCell(String value, Font font, int align, int colspan) {
//		PdfPCell cell = new PdfPCell();
//		cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
//		cell.setHorizontalAlignment(align);
//		cell.setColspan(colspan);
//		cell.setPhrase(new Phrase(value, font));
//		return cell;
//	}
//
//	public static PdfPCell createCell(String value, Font font, int align, int colspan, boolean boderFlag) {
//		PdfPCell cell = new PdfPCell();
//		cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
//		cell.setHorizontalAlignment(align);
//		cell.setColspan(colspan);
//		cell.setPhrase(new Phrase(value, font));
//		cell.setPadding(3.0f);
//		if (!boderFlag) {
//			cell.setBorder(0);
//			cell.setPaddingTop(15.0f);
//			cell.setPaddingBottom(8.0f);
//		}
//		return cell;
//	}
//
//	public static PdfPTable createTable(int colNumber) {
//		PdfPTable table = new PdfPTable(colNumber);
//		try {
//			table.setTotalWidth(maxWidth);
//			table.setLockedWidth(true);
//			table.setHorizontalAlignment(Element.ALIGN_CENTER);
//			table.getDefaultCell().setBorder(1);
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		return table;
//	}
//
//	public static PdfPTable createTable(float[] widths) {
//		PdfPTable table = new PdfPTable(widths);
//		try {
//			table.setTotalWidth(maxWidth);
//			table.setLockedWidth(true);
//			table.setHorizontalAlignment(Element.ALIGN_CENTER);
//			table.getDefaultCell().setBorder(1);
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		return table;
//	}
//
//	public static PdfPTable createBlankTable() {
//		PdfPTable table = new PdfPTable(1);
//		table.getDefaultCell().setBorder(0);
//		table.addCell(createCell("", keyfont));
//		table.setSpacingAfter(20.0f);
//		table.setSpacingBefore(20.0f);
//		return table;
//	}
//	public static void main(String[] args) throws IOException, DocumentException, GeneralSecurityException {
//		sign(new FileInputStream("D:\\IdeaWorkSpace\\v1\\v2\\src\\main\\resources\\pdf\\模版-无公章.pdf"),
//				new FileOutputStream("D:\\IdeaWorkSpace\\v1\\v2\\src\\main\\resources\\pdf\\out.pdf"),
//				new FileInputStream("D:\\IdeaWorkSpace\\v1\\v2\\src\\main\\resources\\whj.p12"),
//				"111111".toCharArray(),
//				"理由",
//				"位置",
//				"D:\\IdeaWorkSpace\\v1\\v2\\src\\main\\resources\\pdf\\chapter.png");
//	}
//
//
//	/**
//	 * 在已经生成的pdf上添加电子签章，生成新的pdf并将其输出出来
//	 * @param src
//	 * @param dest
//	 * @param p12Stream
//	 * @param password
//	 * @param reason
//	 * @param location
//	 * @param chapterPath
//	 * @throws GeneralSecurityException
//	 * @throws IOException
//	 * @throws DocumentException
//	 */
//	public static void sign(InputStream src,   // 需要签章的pdf文件路径
//							OutputStream dest,  // 签完章的pdf文件路径
//							InputStream p12Stream, // p12证书路径
//							char[] password,
//							String reason,  // 签名的原因，显示在pdf签名属性中，随便填
//							String location, // 签名的地点，显示在pdf签名属性中，随便填
//							String chapterPath) // 签名图片的路径
//			throws GeneralSecurityException, IOException, DocumentException {
//
//		// 读取keystore，获得私钥和证书链
//		// 获取PKCS12类型的KeyStore实例
//		KeyStore ks = KeyStore.getInstance("PKCS12");
//		// 加载p12证书，使用密码进行解密
//		ks.load(p12Stream, password);
//		// 获取证书别名
//		String alias = (String) ks.aliases().nextElement();
//		// 通过别名和密码获取私钥
//		PrivateKey pk = (PrivateKey) ks.getKey(alias, password);
//		// 获取证书链
//		Certificate[] chain = ks.getCertificateChain(alias);
//
//		// 读取源PDF文件
//		PdfReader reader = new PdfReader(src);
//		// 创建一个PdfStamper对象，用于对PDF进行签名操作
//		PdfStamper stamper = PdfStamper.createSignature(reader, dest, '\0', null, false);
//		// 获取签名外观对象
//		PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
//		// 设置签名原因
//		appearance.setReason(reason);
//		// 设置签名地点
//		appearance.setLocation(location);
//		// 设置签名的位置和页面
//		appearance.setVisibleSignature(new Rectangle(300, 600, 630, 500), 1, "sig1");
//
//		// 添加签名图片
//		// 获取签名图片
//		Image image = Image.getInstance(chapterPath);
//		// 设置签名图片
//		appearance.setSignatureGraphic(image);
//		// 设置认证级别，不允许签名后再修改
//		appearance.setCertificationLevel(PdfSignatureAppearance.CERTIFIED_NO_CHANGES_ALLOWED);
//		// 设置签名的渲染模式为图片
//		appearance.setRenderingMode(PdfSignatureAppearance.RenderingMode.GRAPHIC);
//
//		// 创建摘要和签名对象
//		ExternalDigest digest = new BouncyCastleDigest();
//		// 使用私钥进行签名，采用SHA-256算法
//		ExternalSignature signature = new PrivateKeySignature(pk, DigestAlgorithms.SHA256, null);
//
//		// 使用MakeSignature.signDetached方法进行签名操作，附加签名
//		MakeSignature.signDetached(appearance, digest, signature, chain, null, null, null, 0, MakeSignature.CryptoStandard.CADES);
//	}
//
//}
